/**
 * 代码生成器前端交互脚本
 * 
 * @author CRUD-Generator
 */

// 全局变量
let currentPreviewData = null;
let sqlHistory = JSON.parse(localStorage.getItem('sqlHistory') || '[]');
let isGenerating = false;

function getFeatureFlags() {
    const securityToggle = $('#enableSecurity');
    const redisToggle = $('#enableRedis');
    return {
        enableSecurity: securityToggle.length ? securityToggle.is(':checked') : false,
        enableRedis: redisToggle.length ? redisToggle.is(':checked') : false
    };
}

$(document).ready(function() {
    // 初始化页面
    initializePage();
    
    // 绑定事件
    bindEvents();
    
    // 加载历史记录
    loadSqlHistory();
    
    // 添加键盘快捷键
    bindKeyboardShortcuts();
});

/**
 * 初始化页面
 */
function initializePage() {
    // 设置默认SQL示例
    const defaultSql = `CREATE TABLE user (
    id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '用户ID',
    username VARCHAR(50) NOT NULL COMMENT '用户名',
    email VARCHAR(100) COMMENT '邮箱地址',
    age INT DEFAULT 0 COMMENT '年龄',
    status TINYINT DEFAULT 1 COMMENT '状态：1-正常，0-禁用',
    created_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    updated_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
) COMMENT '用户信息表';`;
    
    $('#ddlInput').val(defaultSql);
    
    // 隐藏预览区域
    $('#previewSection').hide();
    $('#resultSection').hide();
    
    // 添加SQL模板选择器
    addSqlTemplateSelector();
    
    // 启用实时语法检查
    enableRealTimeSyntaxCheck();
}

/**
 * 绑定事件
 */
function bindEvents() {
    // 验证SQL按钮
    $('#validateBtn').click(function() {
        if (!isGenerating) {
            validateSql();
        }
    });
    
    // 预览代码按钮
    $('#previewBtn').click(function() {
        if (!isGenerating) {
            previewCode();
        }
    });
    
    // 生成代码按钮
    $('#generateBtn').click(function() {
        if (!isGenerating) {
            generateCode();
        }
    });
    
    // 下载代码按钮
    $('#downloadBtn').click(function() {
        if (!isGenerating) {
            downloadCode();
        }
    });
    
    // 复制代码按钮
    $('#copyBtn').click(function() {
        copyCurrentCode();
    });
    
    // 标签页切换
    $('.tab-btn').click(function() {
        const tabName = $(this).data('tab');
        switchTab(tabName);
    });
    
    // 清空按钮
    $('#clearBtn').click(function() {
        clearAll();
    });
    
    // SQL输入框变化事件
    $('#ddlInput').on('input', function() {
        debounce(checkSqlSyntax, 500)();
    });
    
    // 防止重复提交
    $('form').on('submit', function(e) {
        if (isGenerating) {
            e.preventDefault();
            return false;
        }
    });
}

/**
 * 验证SQL语法
 */
function validateSql() {
    const ddl = $('#ddlInput').val().trim();
    
    if (!ddl) {
        showAlert('请输入CREATE TABLE语句', 'warning');
        return;
    }
    
    isGenerating = true;
    updateButtonStates(true);
    showLoading('正在验证SQL语法...');
    
    const featureFlags = getFeatureFlags();
    const requestData = {
        ddl: ddl,
        packagePrefix: $('#packagePrefix').val() || 'com.example',
        author: $('#author').val() || 'CRUD-Generator',
        enableSecurity: featureFlags.enableSecurity,
        enableRedis: featureFlags.enableRedis
    };
    
    $.ajax({
        url: '/api/generator/validate-sql',
        method: 'POST',
        contentType: 'application/json',
        data: JSON.stringify(requestData),
        timeout: 30000, // 30秒超时
        success: function(response) {
            hideLoading();
            isGenerating = false;
            updateButtonStates(false);
            
            if (response.code === 200 && response.data.valid) {
                showAlert('SQL语法验证通过！', 'success');
                updateValidationResult(response.data);
                $('#previewBtn').prop('disabled', false);
                $('#generateBtn').prop('disabled', false);
                
                // 保存到历史记录
                saveSqlToHistory(ddl);
            } else {
                showAlert('SQL语法验证失败：' + (response.data.error || response.message), 'error');
                $('#previewBtn').prop('disabled', true);
                $('#generateBtn').prop('disabled', true);
                showSqlSyntaxError(response.data.error);
            }
        },
        error: function(xhr, status, error) {
            hideLoading();
            isGenerating = false;
            updateButtonStates(false);
            
            let errorMsg = 'SQL验证失败';
            if (status === 'timeout') {
                errorMsg = '请求超时，请检查网络连接';
            } else if (xhr.responseJSON && xhr.responseJSON.message) {
                errorMsg = xhr.responseJSON.message;
            } else if (error) {
                errorMsg = error;
            }
            
            showAlert('验证失败：' + errorMsg, 'error');
            $('#previewBtn').prop('disabled', true);
            $('#generateBtn').prop('disabled', true);
        }
    });
}

/**
 * 预览代码
 */
function previewCode() {
    const ddl = $('#ddlInput').val().trim();
    
    if (!ddl) {
        showAlert('请输入CREATE TABLE语句', 'warning');
        return;
    }
    
    isGenerating = true;
    updateButtonStates(true);
    showLoadingWithProgress('正在生成代码预览...', 0);
    
    const featureFlags = getFeatureFlags();
    const requestData = {
        ddl: ddl,
        packagePrefix: $('#packagePrefix').val() || 'com.example',
        author: $('#author').val() || 'CRUD-Generator',
        enableSecurity: featureFlags.enableSecurity,
        enableRedis: featureFlags.enableRedis
    };
    
    // 模拟进度更新
    let progress = 0;
    const progressInterval = setInterval(() => {
        progress += Math.random() * 20;
        if (progress > 90) progress = 90;
        updateLoadingProgress(progress);
    }, 200);
    
    $.ajax({
        url: '/api/generator/preview-code',
        method: 'POST',
        contentType: 'application/json',
        data: JSON.stringify(requestData),
        timeout: 60000, // 60秒超时
        success: function(response) {
            clearInterval(progressInterval);
            updateLoadingProgress(100);
            
            setTimeout(() => {
                hideLoading();
                isGenerating = false;
                updateButtonStates(false);
                
                if (response.code === 200) {
                    currentPreviewData = response.data;
                    showPreview(response.data);
                    showAlert('代码预览生成成功！', 'success');
                    
                    // 保存到历史记录
                    saveSqlToHistory(ddl);
                } else {
                    showAlert('代码预览失败：' + response.message, 'error');
                }
            }, 500);
        },
        error: function(xhr, status, error) {
            clearInterval(progressInterval);
            hideLoading();
            isGenerating = false;
            updateButtonStates(false);
            
            let errorMsg = '代码预览失败';
            if (status === 'timeout') {
                errorMsg = '请求超时，请稍后重试';
            } else if (xhr.responseJSON && xhr.responseJSON.message) {
                errorMsg = xhr.responseJSON.message;
            }
            
            showAlert('预览失败：' + errorMsg, 'error');
        }
    });
}

/**
 * 生成代码
 */
function generateCode() {
    const ddl = $('#ddlInput').val().trim();
    
    if (!ddl) {
        showAlert('请输入CREATE TABLE语句', 'warning');
        return;
    }
    
    isGenerating = true;
    updateButtonStates(true);
    showLoadingWithProgress('正在生成代码...', 0);
    
    const featureFlags = getFeatureFlags();
    const requestData = {
        ddl: ddl,
        packagePrefix: $('#packagePrefix').val() || 'com.example',
        author: $('#author').val() || 'CRUD-Generator',
        enableSecurity: featureFlags.enableSecurity,
        enableRedis: featureFlags.enableRedis
    };
    
    // 模拟进度更新
    let progress = 0;
    const progressInterval = setInterval(() => {
        progress += Math.random() * 15;
        if (progress > 85) progress = 85;
        updateLoadingProgress(progress);
    }, 300);
    
    $.ajax({
        url: '/api/generator/generate-code',
        method: 'POST',
        contentType: 'application/json',
        data: JSON.stringify(requestData),
        timeout: 90000, // 90秒超时
        success: function(response) {
            clearInterval(progressInterval);
            updateLoadingProgress(100);
            
            setTimeout(() => {
                hideLoading();
                isGenerating = false;
                updateButtonStates(false);
                
                if (response.code === 200) {
                    showGenerationResult(response.data);
                    showAlert('代码生成成功！', 'success');
                    $('#downloadBtn').prop('disabled', false);
                    
                    // 保存到历史记录
                    saveSqlToHistory(ddl);
                    
                    // 显示成功动画
                    showSuccessAnimation();
                } else {
                    showAlert('代码生成失败：' + response.message, 'error');
                }
            }, 800);
        },
        error: function(xhr, status, error) {
            clearInterval(progressInterval);
            hideLoading();
            isGenerating = false;
            updateButtonStates(false);
            
            let errorMsg = '代码生成失败';
            if (status === 'timeout') {
                errorMsg = '生成超时，请检查SQL复杂度或网络连接';
            } else if (xhr.responseJSON && xhr.responseJSON.message) {
                errorMsg = xhr.responseJSON.message;
            }
            
            showAlert('生成失败：' + errorMsg, 'error');
        }
    });
}

/**
 * 下载代码
 */
function downloadCode() {
    const ddl = $('#ddlInput').val().trim();
    
    if (!ddl) {
        showAlert('请先输入CREATE TABLE语句', 'warning');
        return;
    }
    
    showLoading('正在打包下载文件...');
    
    const featureFlags = getFeatureFlags();
    const requestData = {
        ddl: ddl,
        packagePrefix: $('#packagePrefix').val() || 'com.example',
        author: $('#author').val() || 'CRUD-Generator',
        enableSecurity: featureFlags.enableSecurity,
        enableRedis: featureFlags.enableRedis
    };
    
    // 使用fetch API下载文件
    fetch('/api/generator/download-code', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json'
        },
        body: JSON.stringify(requestData)
    })
    .then(response => {
        if (!response.ok) {
            return response.json().then(err => {
                throw new Error(err.message || '下载失败');
            });
        }
        
        // 获取文件名
        const contentDisposition = response.headers.get('Content-Disposition');
        let fileName = 'crud-code.zip';
        if (contentDisposition) {
            const fileNameMatch = contentDisposition.match(/filename="(.+)"/); 
            if (fileNameMatch) {
                fileName = fileNameMatch[1];
            }
        }
        
        return response.blob().then(blob => ({ blob, fileName }));
    })
    .then(({ blob, fileName }) => {
        // 创建下载链接
        const url = window.URL.createObjectURL(blob);
        const a = document.createElement('a');
        a.href = url;
        a.download = fileName;
        document.body.appendChild(a);
        a.click();
        
        // 清理
        window.URL.revokeObjectURL(url);
        document.body.removeChild(a);
        
        hideLoading();
        showAlert('代码包下载成功！', 'success');
    })
    .catch(error => {
        hideLoading();
        console.error('下载失败:', error);
        showAlert('下载失败: ' + error.message, 'error');
    });
}

/**
 * 显示预览
 */
function showPreview(previewData) {
    $('#previewSection').show();
    
    // 默认显示Entity代码
    switchTab('entity');
    
    // 滚动到预览区域
    $('html, body').animate({
        scrollTop: $('#previewSection').offset().top - 100
    }, 500);
}

/**
 * 切换标签页
 */
function switchTab(tabName) {
    if (!currentPreviewData || !currentPreviewData[tabName]) {
        return;
    }
    
    // 更新按钮状态
    $('.tab-btn').removeClass('active');
    $(`.tab-btn[data-tab="${tabName}"]`).addClass('active');
    
    // 更新代码内容
    const code = currentPreviewData[tabName];
    $('#codePreview').text(code);
    
    // 应用语法高亮
    if (typeof Prism !== 'undefined') {
        Prism.highlightElement($('#codePreview')[0]);
    }
}

/**
 * 复制当前代码
 */
function copyCurrentCode() {
    // 优先复制预览代码
    const previewCode = $('#codePreview').text();
    
    if (previewCode && previewCode.trim()) {
        // 使用现代的Clipboard API
        if (navigator.clipboard) {
            navigator.clipboard.writeText(previewCode).then(() => {
                showAlert('代码已复制到剪贴板', 'success');
            }).catch(() => {
                fallbackCopyTextToClipboard(previewCode);
            });
        } else {
            fallbackCopyTextToClipboard(previewCode);
        }
        return;
    }
    
    // 如果没有预览代码，则复制完整的生成数据
    if (currentPreviewData && currentPreviewData.files) {
        let allCode = '';
        Object.keys(currentPreviewData.files).forEach(fileName => {
            allCode += `// ${fileName}\n`;
            allCode += currentPreviewData.files[fileName];
            allCode += '\n\n';
        });
        
        if (navigator.clipboard) {
            navigator.clipboard.writeText(allCode).then(() => {
                showAlert('代码已复制到剪贴板', 'success');
            }).catch(() => {
                fallbackCopyTextToClipboard(allCode);
            });
        } else {
            fallbackCopyTextToClipboard(allCode);
        }
        return;
    }
    
    // 如果都没有，复制SQL输入内容
    const ddl = $('#ddlInput').val().trim();
    if (ddl) {
        if (navigator.clipboard) {
            navigator.clipboard.writeText(ddl).then(() => {
                showAlert('SQL已复制到剪贴板', 'success');
            }).catch(() => {
                fallbackCopyTextToClipboard(ddl);
            });
        } else {
            fallbackCopyTextToClipboard(ddl);
        }
        return;
    }
    
    showAlert('没有可复制的内容', 'warning');
}

/**
 * 后备的复制到剪贴板方法（兼容旧浏览器）
 */
function fallbackCopyTextToClipboard(text) {
    const textarea = document.createElement('textarea');
    textarea.value = text;
    document.body.appendChild(textarea);
    textarea.select();
    
    try {
        document.execCommand('copy');
        showAlert('代码已复制到剪贴板', 'success');
    } catch (err) {
        showAlert('复制失败，请手动复制', 'error');
    }
    
    document.body.removeChild(textarea);
}

/**
 * 更新验证结果
 */
function updateValidationResult(data) {
    let html = '<div class="validation-result">';
    html += `<p><strong>表名：</strong>${data.tableName}</p>`;
    html += `<p><strong>字段数量：</strong>${data.columnCount}</p>`;
    html += `<p><strong>主键：</strong>${data.hasPrimaryKey ? '是' : '否'}</p>`;
    html += '</div>';
    
    $('#validationResult').html(html).show();
}

/**
 * 显示生成结果
 */
function showGenerationResult(data) {
    $('#resultSection').show();
    
    let html = '<div class="generation-result">';
    html += `<h4>生成完成</h4>`;
    html += `<p><strong>表名：</strong>${data.tableName}</p>`;
    html += `<p><strong>字段数量：</strong>${data.columnCount}</p>`;
    html += `<p><strong>自增主键：</strong>${data.hasAutoIncrement ? '是' : '否'}</p>`;
    html += '<p><strong>生成的文件：</strong></p>';
    html += '<ul>';
    data.generatedFiles.forEach(file => {
        html += `<li>${file}</li>`;
    });
    html += '</ul>';
    html += '</div>';
    
    $('#generationResult').html(html);
    
    // 滚动到结果区域
    $('html, body').animate({
        scrollTop: $('#resultSection').offset().top - 100
    }, 500);
}

/**
 * 清空所有内容
 */
function clearAll() {
    if (confirm('确定要清空所有内容吗？')) {
        $('#ddlInput').val('');
        $('#packagePrefix').val('');
        $('#author').val('');
        $('#previewSection').hide();
        $('#resultSection').hide();
        $('#validationResult').hide();
        currentPreviewData = null;
        
        $('#previewBtn').prop('disabled', true);
        $('#generateBtn').prop('disabled', true);
        $('#downloadBtn').prop('disabled', true);
        
        showAlert('内容已清空', 'info');
    }
}

/**
 * 显示加载状态
 */
function showLoading(message) {
    // 禁用所有按钮
    $('button').prop('disabled', true);
    
    // 显示加载提示
    if (!$('#loadingModal').length) {
        $('body').append(`
            <div id="loadingModal" class="modal fade" tabindex="-1">
                <div class="modal-dialog modal-sm">
                    <div class="modal-content">
                        <div class="modal-body text-center">
                            <div class="spinner-border text-primary" role="status">
                                <span class="sr-only">Loading...</span>
                            </div>
                            <p class="mt-2" id="loadingMessage">${message}</p>
                        </div>
                    </div>
                </div>
            </div>
        `);
    } else {
        $('#loadingMessage').text(message);
    }
    
    $('#loadingModal').modal('show');
}

/**
 * 隐藏加载状态
 */
function hideLoading() {
    $('#loadingModal').modal('hide');
    
    // 恢复按钮状态
    $('button').prop('disabled', false);
    
    // 根据当前状态设置按钮
    if (!$('#ddlInput').val().trim()) {
        $('#previewBtn').prop('disabled', true);
        $('#generateBtn').prop('disabled', true);
    }
    
    if (!currentPreviewData) {
        $('#downloadBtn').prop('disabled', true);
    }
}

/**
 * 显示提示消息
 */
function showAlert(message, type) {
    const alertClass = {
        'success': 'alert-success',
        'error': 'alert-danger',
        'warning': 'alert-warning',
        'info': 'alert-info'
    }[type] || 'alert-info';
    
    const alertHtml = `
        <div class="alert ${alertClass} alert-dismissible fade show" role="alert">
            ${message}
            <button type="button" class="close" data-dismiss="alert">
                <span>&times;</span>
            </button>
        </div>
    `;
    
    $('#alertContainer').html(alertHtml);
    
    // 自动隐藏成功和信息提示
    if (type === 'success' || type === 'info') {
        setTimeout(() => {
            $('.alert').alert('close');
        }, 3000);
    }
}

/**
 * 显示带进度的加载状态
 */
function showLoadingWithProgress(message, progress) {
    $('button').prop('disabled', true);
    
    if (!$('#loadingModal').length) {
        $('body').append(`
            <div id="loadingModal" class="modal fade" tabindex="-1">
                <div class="modal-dialog modal-sm">
                    <div class="modal-content">
                        <div class="modal-body text-center">
                            <div class="spinner-border text-primary" role="status">
                                <span class="sr-only">Loading...</span>
                            </div>
                            <p class="mt-2" id="loadingMessage">${message}</p>
                            <div class="progress mt-2" id="loadingProgress">
                                <div class="progress-bar" role="progressbar" style="width: ${progress}%"></div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        `);
    } else {
        $('#loadingMessage').text(message);
        updateLoadingProgress(progress);
    }
    
    $('#loadingModal').modal('show');
}

/**
 * 更新加载进度
 */
function updateLoadingProgress(progress) {
    $('#loadingProgress .progress-bar').css('width', progress + '%');
}

/**
 * 更新按钮状态
 */
function updateButtonStates(disabled) {
    $('#validateBtn').prop('disabled', disabled);
    $('#previewBtn').prop('disabled', disabled);
    $('#generateBtn').prop('disabled', disabled);
    $('#downloadBtn').prop('disabled', disabled);
}

/**
 * 保存SQL到历史记录
 */
function saveSqlToHistory(sql) {
    if (!sql || sql.trim() === '') return;
    
    // 避免重复
    const index = sqlHistory.indexOf(sql);
    if (index > -1) {
        sqlHistory.splice(index, 1);
    }
    
    // 添加到开头
    sqlHistory.unshift(sql);
    
    // 限制历史记录数量
    if (sqlHistory.length > 10) {
        sqlHistory = sqlHistory.slice(0, 10);
    }
    
    // 保存到本地存储
    localStorage.setItem('sqlHistory', JSON.stringify(sqlHistory));
    
    // 更新历史记录显示
    updateSqlHistoryDisplay();
}

/**
 * 加载SQL历史记录
 */
function loadSqlHistory() {
    updateSqlHistoryDisplay();
}

/**
 * 更新SQL历史记录显示
 */
function updateSqlHistoryDisplay() {
    const historyContainer = $('#sqlHistoryContainer');
    if (!historyContainer.length) return;
    
    if (sqlHistory.length === 0) {
        historyContainer.html('<p class="text-muted">暂无历史记录</p>');
        return;
    }
    
    let html = '<div class="sql-history-list">';
    sqlHistory.forEach((sql, index) => {
        const preview = sql.length > 50 ? sql.substring(0, 50) + '...' : sql;
        html += `
            <div class="history-item" data-index="${index}">
                <div class="history-preview">${escapeHtml(preview)}</div>
                <div class="history-actions">
                    <button class="btn btn-sm btn-outline-primary load-history" data-index="${index}">加载</button>
                    <button class="btn btn-sm btn-outline-danger delete-history" data-index="${index}">删除</button>
                </div>
            </div>
        `;
    });
    html += '</div>';
    
    historyContainer.html(html);
    
    // 绑定事件
    $('.load-history').click(function() {
        const index = $(this).data('index');
        loadSqlFromHistory(index);
    });
    
    $('.delete-history').click(function() {
        const index = $(this).data('index');
        deleteSqlFromHistory(index);
    });
}

/**
 * 从历史记录加载SQL
 */
function loadSqlFromHistory(index) {
    if (index >= 0 && index < sqlHistory.length) {
        $('#ddlInput').val(sqlHistory[index]);
        showAlert('已加载历史SQL', 'success');
    }
}

/**
 * 从历史记录删除SQL
 */
function deleteSqlFromHistory(index) {
    if (index >= 0 && index < sqlHistory.length) {
        sqlHistory.splice(index, 1);
        localStorage.setItem('sqlHistory', JSON.stringify(sqlHistory));
        updateSqlHistoryDisplay();
        showAlert('已删除历史记录', 'info');
    }
}

/**
 * 添加SQL模板选择器
 */
function addSqlTemplateSelector() {
    const templates = {
        'user': {
            name: '用户表',
            sql: `CREATE TABLE user (
    id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '用户ID',
    username VARCHAR(50) NOT NULL COMMENT '用户名',
    email VARCHAR(100) COMMENT '邮箱地址',
    age INT DEFAULT 0 COMMENT '年龄',
    status TINYINT DEFAULT 1 COMMENT '状态：1-正常，0-禁用',
    created_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    updated_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
) COMMENT '用户信息表';`
        },
        'product': {
            name: '商品表',
            sql: `CREATE TABLE product (
    id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '商品ID',
    name VARCHAR(200) NOT NULL COMMENT '商品名称',
    price DECIMAL(10,2) NOT NULL COMMENT '价格',
    stock INT DEFAULT 0 COMMENT '库存',
    category_id BIGINT COMMENT '分类ID',
    description TEXT COMMENT '商品描述',
    status TINYINT DEFAULT 1 COMMENT '状态：1-上架，0-下架',
    created_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    updated_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
) COMMENT '商品信息表';`
        },
        'order': {
            name: '订单表',
            sql: `CREATE TABLE orders (
    id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '订单ID',
    order_no VARCHAR(50) NOT NULL UNIQUE COMMENT '订单号',
    user_id BIGINT NOT NULL COMMENT '用户ID',
    total_amount DECIMAL(10,2) NOT NULL COMMENT '总金额',
    status TINYINT DEFAULT 1 COMMENT '状态：1-待付款，2-已付款，3-已发货，4-已完成，5-已取消',
    remark VARCHAR(500) COMMENT '备注',
    created_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    updated_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
) COMMENT '订单信息表';`
        }
    };
    
    const templateSelector = $('#templateSelector');
    if (templateSelector.length) {
        let options = '<option value="">选择模板...</option>';
        Object.keys(templates).forEach(key => {
            options += `<option value="${key}">${templates[key].name}</option>`;
        });
        templateSelector.html(options);
        
        templateSelector.change(function() {
            const templateKey = $(this).val();
            if (templateKey && templates[templateKey]) {
                $('#ddlInput').val(templates[templateKey].sql);
                showAlert('已加载模板：' + templates[templateKey].name, 'success');
            }
        });
    }
}

/**
 * 绑定键盘快捷键
 */
function bindKeyboardShortcuts() {
    $(document).keydown(function(e) {
        // Ctrl+Enter: 验证SQL
        if (e.ctrlKey && e.keyCode === 13) {
            e.preventDefault();
            if (!isGenerating) {
                validateSql();
            }
        }
        
        // Ctrl+Shift+P: 预览代码
        if (e.ctrlKey && e.shiftKey && e.keyCode === 80) {
            e.preventDefault();
            if (!isGenerating) {
                previewCode();
            }
        }
        
        // Ctrl+Shift+G: 生成代码
        if (e.ctrlKey && e.shiftKey && e.keyCode === 71) {
            e.preventDefault();
            if (!isGenerating) {
                generateCode();
            }
        }
        
        // Ctrl+Shift+D: 下载代码
        if (e.ctrlKey && e.shiftKey && e.keyCode === 68) {
            e.preventDefault();
            if (!isGenerating) {
                downloadCode();
            }
        }
        
        // Ctrl+Shift+C: 复制代码
        if (e.ctrlKey && e.shiftKey && e.keyCode === 67) {
            e.preventDefault();
            copyCurrentCode();
        }
        
        // Escape: 清空
        if (e.keyCode === 27) {
            e.preventDefault();
            clearAll();
        }
    });
}

/**
 * 启用实时语法检查
 */
function enableRealTimeSyntaxCheck() {
    let syntaxCheckTimeout;
    
    $('#ddlInput').on('input', function() {
        clearTimeout(syntaxCheckTimeout);
        syntaxCheckTimeout = setTimeout(() => {
            checkSqlSyntax();
        }, 1000);
    });
}

/**
 * 检查SQL语法
 */
function checkSqlSyntax() {
    const sql = $('#ddlInput').val().trim();
    if (!sql) return;
    
    // 简单的语法检查
    const syntaxErrors = [];
    
    if (!sql.toUpperCase().includes('CREATE TABLE')) {
        syntaxErrors.push('缺少CREATE TABLE语句');
    }
    
    if (!sql.includes('(') || !sql.includes(')')) {
        syntaxErrors.push('缺少字段定义括号');
    }
    
    if (!sql.trim().endsWith(';')) {
        syntaxErrors.push('建议以分号结尾');
    }
    
    showSqlSyntaxResult(syntaxErrors);
}

/**
 * 显示SQL语法检查结果
 */
function showSqlSyntaxResult(errors) {
    const syntaxResult = $('#syntaxResult');
    if (!syntaxResult.length) return;
    
    if (errors.length === 0) {
        syntaxResult.html('<span class="text-success"><i class="fas fa-check"></i> 语法检查通过</span>');
    } else {
        let html = '<span class="text-warning"><i class="fas fa-exclamation-triangle"></i> 语法提示：</span><ul>';
        errors.forEach(error => {
            html += `<li class="text-warning">${error}</li>`;
        });
        html += '</ul>';
        syntaxResult.html(html);
    }
}

/**
 * 显示SQL语法错误
 */
function showSqlSyntaxError(error) {
    const syntaxResult = $('#syntaxResult');
    if (syntaxResult.length && error) {
        syntaxResult.html(`<span class="text-danger"><i class="fas fa-times"></i> 语法错误：${error}</span>`);
    }
}

/**
 * 显示成功动画
 */
function showSuccessAnimation() {
    // 创建成功动画效果
    const successIcon = $('<div class="success-animation"><i class="fas fa-check-circle"></i></div>');
    $('body').append(successIcon);
    
    setTimeout(() => {
        successIcon.addClass('show');
    }, 100);
    
    setTimeout(() => {
        successIcon.remove();
    }, 2000);
}

/**
 * 防抖函数
 */
function debounce(func, wait) {
    let timeout;
    return function executedFunction(...args) {
        const later = () => {
            clearTimeout(timeout);
            func(...args);
        };
        clearTimeout(timeout);
        timeout = setTimeout(later, wait);
    };
}

/**
  * HTML转义
  */
 function escapeHtml(text) {
     const map = {
         '&': '&amp;',
         '<': '&lt;',
         '>': '&gt;',
         '"': '&quot;',
         "'": '&#039;'
     };
     return text.replace(/[&<>"']/g, function(m) { return map[m]; });
 }
 
 /**
  * 清空SQL历史记录
  */
 function clearSqlHistory() {
     if (confirm('确定要清空所有SQL历史记录吗？')) {
         sqlHistory = [];
         localStorage.removeItem('sqlHistory');
         updateSqlHistoryDisplay();
         showAlert('历史记录已清空', 'info');
         
         // 关闭模态框
         const modal = bootstrap.Modal.getInstance(document.getElementById('historyModal'));
         if (modal) {
             modal.hide();
         }
     }
 }
 
 /**
  * 清空所有内容
  */
 function clearAll() {
     if (confirm('确定要清空所有内容吗？')) {
         $('#ddlInput').val('');
         $('#syntaxResult').html('');
         $('#previewResult').hide();
         $('#generateResult').hide();
         currentPreviewData = null;
         
         // 重置按钮状态
         $('#previewBtn').prop('disabled', true);
         $('#generateBtn').prop('disabled', true);
         $('#downloadBtn').prop('disabled', true);
         
         showAlert('内容已清空', 'info');
     }
 }
